package processes

import (
	"encoding/json"
	"errors"
	"fmt"
	"go-web-learning/src/02_message_system/02_message_system/chatroom/common/constants"
	"go-web-learning/src/02_message_system/02_message_system/chatroom/common/message"
	"go-web-learning/src/02_message_system/02_message_system/chatroom/common/netWork"
)

type UserProcess struct {
}

// Login 登陆校验
func (up *UserProcess) Login(userId int, userPwd string) (err error) {

	// 链接到服务器
	conn, err := netWork.Dial("tcp", "0.0.0.0:9805")
	if err != nil {
		fmt.Println("net dial err:", err)
		return
	}
	defer conn.Close()

	// 创建Message结构体
	msg := message.Message{}

	// 设置Message类型
	msg.SetType(constants.MSG_TYPE_LOGIN_REQ)

	// 创建登陆信息
	loginMsg := message.ClientMsgLogin{
		UserId:  userId,
		UserPwd: userPwd,
	}

	// 设置登陆消息

	err = msg.SetData(loginMsg)
	if err != nil {
		fmt.Println("msg setData err:", err)
		return
	}
	conn.SetMsg(msg)
	// 序列化 --> 发送长度 --> 发送消息本身
	_, err = conn.Send()
	if err != nil {
		fmt.Println("send msg err:", err)
		return
	}
	resp, err := conn.Get()
	if err != nil {
		return err
	}
	var loginRespMsg message.SrvMsgLogin
	err = json.Unmarshal([]byte(resp.Data), &loginRespMsg)
	if loginRespMsg.Code == constants.RESP_CODE_SUCCESS {
		// 需要起一个协程，该协程保持和服务器端的通讯，如果服务器有消息推送，可以接收并显示
		//fmt.Println(loginRespMsg)
		initCurUser(conn, loginRespMsg.User)
		userManagerProcess.InitFriends(loginRespMsg.Friends)
		go ServerProcessMsg(conn)
		ShowMenu()
		return nil
	} else {
		err = errors.New(loginRespMsg.Msg)
	}
	fmt.Println("登陆失败:", err)
	return err
}

func (up *UserProcess) Register(userId int, userPwd, userName string) (err error) {
	// 链接到服务器
	conn, err := netWork.Dial("tcp", "0.0.0.0:9805")
	if err != nil {
		fmt.Println("net dial err:", err)
		return
	}
	defer conn.Close()

	// 创建Message结构体
	msg := message.Message{}

	// 设置Message类型
	msg.SetType(constants.MSG_TYPE_REGISTER_REQ)

	// 创建注册信息
	registerMsg := message.ClientMsgRegister{}
	registerMsg.UserId = userId
	registerMsg.UserPwd = userPwd
	registerMsg.UserName = userName
	// 设置登陆消息
	err = msg.SetData(registerMsg)
	if err != nil {
		fmt.Println("msg setData err:", err)
		return
	}
	conn.SetMsg(msg)
	// 序列化 --> 发送长度 --> 发送消息本身
	_, err = conn.Send()
	if err != nil {
		fmt.Println("send msg err:", err)
		return
	}
	resp, err := conn.Get()
	if err != nil {
		return err
	}
	var registerRespMsg message.SrvMsgRegister
	err = json.Unmarshal([]byte(resp.Data), &registerRespMsg)
	fmt.Println("22222", registerRespMsg, "33333333", resp.Data)
	if registerRespMsg.Code == constants.RESP_CODE_SUCCESS {
		return nil
	} else {
		err = errors.New(registerRespMsg.Msg)
	}
	fmt.Println("注册失败:", err)
	return err
}
